<?php

class Sesion
{

	public static function init()
	{
		session_start();
	}

	public static function destruir( $clave = false )
	{

		if($clave)
		{
			if( is_array( $clave ) )
			{
				for( $i = 0; $i < count($clave); $i++)
				{
					if( isset( $_SESSION[ $clave[$i] ] ) )
						unset( $_SESSION[ $clave[$i] ] );
				}
			}
			else
			{
				if( isset( $_SESSION[ $clave[$i] ] ) )
					unset($_SESSION[ $clave[$i] ]);
			}
		}else{
			session_destroy();
		}
	}

	public static function asignar( $clave, $valor )
	{
		if( !empty( $clave ) )
		$_SESSION[$clave] = $valor;
	}

	public static function obtener( $clave )
	{
		if( isset( $_SESSION[$clave] ) )
			return $_SESSION[$clave];
	}

	public static function acceso( $nivel )
	{
		if( !Sesion::obtener( 'autenticado') ){
			header('location:' . BASE_URL . 'error/acceso/101');
			exit;
		}

		Sesion::tiempo();

		if( Sesion::obtenerNivel( $nivel ) >  Sesion::obtenerNivel( Sesion::obtener( 'nivel' )) ){
			header('location:' . BASE_URL . 'error/acceso/101');
			exit;
		}		
	}

	public static function accesoVista()
	{
		if( !Sesion::obtener( 'autenticado' ) ){
			return false;
		}

		if( Sesion::obtenerNivel( $nivel ) >  Sesion::obtenerNivel( Sesion::obtener( 'nivel' )) ){
			header('location:' . BASE_URL . 'error/acceso/101');
			return false;
		}

		return true;
	}


	public static function obtenerNivel ( $nivel )
	{
		$perfil['admin'] = 3;
		$perfil['especial'] = 2;
		$perfil['usuario'] = 1;

		if( !array_key_exists( $nivel , $perfil ))
			throw new Exception("Error de acceso...");
		else
			return $perfil[ $nivel ];
	}

	public static function accesoControlado( array $nivel, $noAdmin = false )
	{
		if( !Sesion::obtener( 'autenticado' ) ){
			header('location:' . BASE_URL . 'error/acceso/101');
			return false;
		}

		Sesion::tiempo();

		if($noAdmin == true)
		{
			if( !Sesion::obtener( 'nivel' ) == 'admin')
				return;
		}

		if( count($nivel) )
		{
			if( in_array( Sesion::obtener ( 'nivel' ) , $nivel) )
				return;
		}

		header('location:' . BASE_URL . 'error/acceso/101');
	}

	public static function accesoVistaControlado( array $nivel, $noAdmin = false )
	{

		if( !Sesion::obtener( 'autenticado' ) ){
			return false;
		}

		if($noAdmin == true)
		{
			if( !Sesion::obtener( 'nivel' ) == 'admin')
				return true;
		}

		if( count($nivel) )
		{
			if( in_array( Sesion::obtener ( 'nivel' ) , $nivel) )
				return true;
		}

		return false;
	}

	public static function tiempo()
	{
		if( !Sesion::obtener( 'tiempo' ) || !defined( 'SESION_TIEMPO' ))
			throw new Exception("no se ha definido el tiempo de sesion");

		if(SESION_TIEMPO == 0)
		{
			return 0;
		}

		if( time() - Sesion::obtener( 'tiempo' ) > (SESION_TIEMPO * 60 ) )
		{
			Sesion::destruir();
			header( 'location:' . BASE_URL . 'error/acceso/102' );
		}
		else
		{
			Sesion::asignar( 'tiempo', time() );
		}
	}

}

?>